/*
 * license-updater - Copyright (c) 2012 MSF. All rights reserved.
 * 
 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
 * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */
package br.msf.commons.netbeans.util;

import java.util.Collection;
import java.util.TreeSet;
import javax.swing.ComboBoxModel;
import javax.swing.ListCellRenderer;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.spi.java.project.support.ui.PackageView;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.util.Lookup;
import org.openide.util.Utilities;

/**
 * <p>TODO
 *
 * @author Marcius da Silva da Fonseca (sf.marcius@gmail.com)
 * @version 1.0
 * @since license-updater-1.0
 */
public abstract class PackageUtils {

    public static DataObject getSelectedPackage() {
        return getSelectedPackage(Utilities.actionsGlobalContext());
    }

    public static DataObject getSelectedPackage(final Lookup context) {
        Lookup.Result<DataObject> packageLookup = context.lookupResult(DataObject.class);
        return (packageLookup.allInstances().isEmpty()) ? null : packageLookup.allInstances().iterator().next();
    }

    public static boolean containsPackage(ClassPath classPath, String fullPackageName) {
        for (FileObject cpRoot : classPath.getRoots()) {
            FileObject fo = FileObjectUtils.getPackageFileObject(cpRoot, fullPackageName);
            if (fo != null) {
                return true;
            }
        }
        return false;
    }

    public static Collection<JavaPackage> getPackages(final ClassPath classPath, final boolean includeRootPackage) {
        Collection<JavaPackage> packages = new TreeSet<JavaPackage>();
        for (FileObject root : classPath.getRoots()) {
            addPackages(classPath, root, includeRootPackage, packages);
//            JavaPackage pack = new JavaPackage(classPath, root);
//            if ((pack.isRoot() && includeRootPackage) || !pack.hasSubPackage() || pack.hasFileChildren()) {
//                packages.add(pack);
//            }
//            for (FileObject subPkg : pack.getChildren()) {
//                addPackages(classPath, subPkg, packages);
//            }
        }
        return packages;
    }

    private static void addPackages(final ClassPath classPath,
                                    final FileObject rootPackage,
                                    final boolean includeRootPackage,
                                    final Collection<JavaPackage> packCollection) {
        if (FileObjectUtils.isValidDir(rootPackage)) {
            final JavaPackage pack = new JavaPackage(classPath, rootPackage);
            if ((pack.isRoot() && includeRootPackage) || !pack.hasSubPackage() || pack.hasFileChildren()) {
                packCollection.add(pack);
            }
            for (FileObject subPkg : rootPackage.getChildren()) {
                addPackages(classPath, subPkg, includeRootPackage, packCollection);
            }
        }
    }

    public static ComboBoxModel getPackageComboModel(Project project) {
        return PackageView.createListView((org.netbeans.api.project.ProjectUtils.getSources(project)).getSourceGroups(
                JavaProjectConstants.SOURCES_TYPE_JAVA)[0]);
    }

    public static ListCellRenderer getPackageComboRenderer() {
        return PackageView.listRenderer();
    }
}
